Esta questão já tem respostas aqui: Nenhuma conversão implícita no operador sobrecarregado (2 respostas) Fechado há 7 anos. Estou escrevendo um wrapper simples para um tipo elementar e estou tentando evitar ter que escrever muitos tipos de operadores padrão. Eu esperava que a conversão implícita de tipo ajudasse, mas não ajuda. Aqui está um exemplo simplificado: struct Int { int _i; Int (int i = 0): _i {i} {} Operador Int + (const Int & rhs) {return _i + rhs._i;} }; int main (int argc, char * argv []) { (vazio) (Int (1) + 2); // Multar (vazio) (2 + Int (1)); // erro: operandos inválidos para expressão binária ('int' e 'Int') } Estou usando o llvm. A primeira linha de compilações principais está bem O segundo causa um erro. Agora, o que eu esperava que acontecesse na segunda linha é que 2 fosse convertido implicitamente em Int (2), seguido por uma chamada para o operador +. Por que isso não está acontecendo? Por que a conversão implícita está acontecendo na primeira linha?
2021-03-01 08:19:43
Isso acontece na primeira linha porque o único operador + disponível é o operador + (Int &) (que tem um primeiro parâmetro implícito de Int para esta instância). A segunda linha falha porque o primeiro parâmetro é um int e não faz ideia de que precisa convertê-lo antes de tentar a operação (não sabe que precisa usar Int :: operator +). Você pode evitar esse problema tornando a operadora uma função de amigo não membro (http://ideone.com/YCf7wX) struct Int { int _i; Int (int i = 0): _i {i} {} operador amigo Int + (const Int & lhs, const Int & rhs); }; Operador Int + (const Int & lhs, const Int & rhs) { return lhs._i + rhs._i; } int main () { Int i; i + 5; 5 + i; return 0; } | Não é a resposta que você está procurando? Navegue por outras questões marcadas com conversão implícita de palavra-chave do operador c ++ ou faça sua própria pergunta.